# -*-coding utf-8 -*-

__project__ = 'le-bo16'
__file_name__ = 'homework11'
__author__ = 'hqDu'
__time__ = '2020-11-27 22:21'
__product_name = 'PyCharm'
# @fileName :homework11.py

# 1.这两个参数是什么意思：*args，**kwargs？我们为什么要使用它们？
# *args 不定长参数之元组
# **kwargs 不定长参数之字典
# 这些参数可以用在类的属性和方法内
# 原因：不确定传递的参数的数量的情况下，就可以使用不定长参数
# 当有多个参数时，且每次使用函数时参数的个数是不确定的时，可以考虑使用
# 2.代码输出什么
# def f(x,l=[]):
#     print(id(l))
#     for i in range(x):
#         l.append(i*i)
#     print(l)
#
# f(2)  # [0, 1]
# f(3,[3,2,1])  # [3, 2, 1, 0, 1, 4]
# f(3)  # [0, 1, 0, 1, 4]
'''
预期：f(3) [0,1,4]
实际：f(3) [0, 1, 0, 1, 4]

通过执行以上程序，发现没有传递列表参数的函数调用打印的列表的id是一样的，
而传递参数列表的函数的id是与没有传递列表参数的id是不一样的

因为，函数定义时，会保存函数中默认参数list的值，也就是列表[]；
每次调用中，如果传递了列表，就是用传递的列表；如果没有传递列表就使用定义函数时保存的默认参数list
f(2),f(3)都使用的是默认的参数列表，列表的append是在原来的基础上叠加，所以会出现开始的0,1

如果想要实现预期的结果，可以使用如下方法
'''

# def f(x,l=None):
#     if l == None:
#         l = []
#     print(id(l))
#     for i in range(x):
#         l.append(i*i)
#     print(l)
#
# f(2)
# f(3,[3,2,1])
# f(3)
# 3、如何在一个函数内部修改全局变量
# 在函数内对全局变量进行 global 全局变量名
# 那么之后在函数内即使出现了和全局变量名字相同的 变量名=数据，也理解为对全局变量的修改

# 4、用lambda函数实现两个数相乘
# res = lambda a,b:a*b
# print(res(2,3))
# 5、列表推导式求列表所有奇数并构造新列表，a =  [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]